package fatal_error

import (
	"context"
	"fmt"
	"github.com/go-errors/errors"
	"github.com/zeromicro/go-zero/core/logx"
	"payme3000/framework/errorx"
)

type (
	// IFatal 致命错误, 会触发服务治理的规则
	IFatal interface {
		error
		placeholderFatal()
	}

	// Fatal IFatal的基础实现
	Fatal errors.Error
)

func (f *Fatal) Error() string {
	return f.Err.Error()
}

func (f *Fatal) placeholderFatal() {}

// Errorf 触发error, 打印调用栈
func Errorf(ctx context.Context, format string, a ...any) error {
	return Throw(ctx, fmt.Errorf(format, a...), 2)
}

// New 触发error, 打印调用栈
func New(ctx context.Context, msg string) error {
	return Throw(ctx, fmt.Errorf(msg), 2)
}

// Throw 捕获error, 打印调用栈, 返回wrap后的error
func Throw(ctx context.Context, err any, skip ...int) error {
	_skip := 1 // default
	if len(skip) > 0 {
		_skip = skip[0]
	}
	wrapErr := errors.Wrap(err, _skip)
	logx.WithContext(ctx).WithCallerSkip(_skip).Errorf("%s", errorx.PrintError(wrapErr))

	fatalErr := (*Fatal)(wrapErr)

	return fatalErr
}
